{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "freelance-silver",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "0 % 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "grateful-strategy",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "2 % 2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "greatest-binding",
   "metadata": {},
   "source": [
    "https://leetcode.com/problems/insert-interval\n",
    "\n",
    "Wrong Answer (I think my answer is better than the \"right answer\")\n",
    "\n",
    "```python\n",
    "class Solution:\n",
    "    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:\n",
    "        #5:56\n",
    "        a = newInterval[0]\n",
    "        b = newInterval[1]\n",
    "        the_list = []\n",
    "        for interval in intervals:\n",
    "            if a != None:\n",
    "                if a > interval[0] and a < interval[1]:\n",
    "                    a = None\n",
    "            if b != None:\n",
    "                if b > interval[0] and b < interval[1]:\n",
    "                    b = None\n",
    "            if interval[0] < newInterval[0] or interval[0] > newInterval[1]:\n",
    "                the_list.append(interval[0])\n",
    "            if interval[1] < newInterval[0] or interval[1] > newInterval[1]:\n",
    "                the_list.append(interval[1])\n",
    "        if a is not None:\n",
    "            the_list.append(a)\n",
    "        if b is not None:\n",
    "            the_list.append(b)\n",
    "        the_list.sort()\n",
    "        print(the_list)\n",
    "        real_list = []\n",
    "        for i,v in enumerate(the_list):\n",
    "            if i%2 == 0 and i != len(the_list)-1:\n",
    "                real_list.append([])\n",
    "            real_list[-1].append(v)\n",
    "        for i,v in enumerate(real_list):\n",
    "            if len(v) != 2 and i != 0:\n",
    "                real_list[i-1][1] = real_list[i][0] \n",
    "                real_list[i] = real_list[i][-2:]\n",
    "            if len(v) != 2 and i == 0:\n",
    "                real_list[i] = [real_list[i][0], real_list[i][-1]]\n",
    "        return real_list\n",
    "        #6:06\n",
    "              \n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "elementary-biology",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9e269e12-647a-445f-ac16-4ce2ad3013b6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "2bb42d12-7a1c-46b7-a8be-4c371b9716bd",
   "metadata": {},
   "source": [
    "https://leetcode.com/problems/insert-interval\n",
    "\n",
    "\n",
    "Accepted\n",
    "\n",
    "\n",
    "___\n",
    "\n",
    "\n",
    "After a whole day, finally I solved this problem by using 259 lines of code!!!\n",
    "\n",
    "It is not easy!\n",
    "\n",
    "But I did it!\n",
    "\n",
    "___\n",
    "\n",
    "\n",
    "```python\n",
    "class Solution:\n",
    "    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:\n",
    "        #2022.12.4 05:48 - 11:49, write broken code\n",
    "        #2022.12.4 14:35 \n",
    "        new_interval_start, new_interval_end = newInterval\n",
    "\n",
    "        if len(intervals) == 0:\n",
    "            return [newInterval]\n",
    "        \n",
    "        if len(intervals) == 1:\n",
    "            start, end = intervals[0]\n",
    "            if start <= new_interval_start <= new_interval_end <= end:\n",
    "                # mode A\n",
    "                return [[start, end]]\n",
    "\n",
    "            elif new_interval_start < start and end < new_interval_end:\n",
    "                # mode E\n",
    "                return [[new_interval_start, new_interval_end]]\n",
    "\n",
    "            elif start <= new_interval_start <= end and new_interval_end > end:\n",
    "                # mode C\n",
    "                return [[start, new_interval_end]]\n",
    "\n",
    "            elif new_interval_start < start and start <= new_interval_end <= end:\n",
    "                # mode D\n",
    "                return [[new_interval_start, end]]\n",
    "\n",
    "            elif end < new_interval_start:\n",
    "                # mode F\n",
    "                return [[start, end], [new_interval_start, new_interval_end]]\n",
    "\n",
    "            elif new_interval_end < start:\n",
    "                # mode G\n",
    "                return [[new_interval_start, new_interval_end], [start, end]]\n",
    "\n",
    "        def get_final_intervals():\n",
    "            final_intervals = []\n",
    "            process_type = None\n",
    "    \n",
    "            index = 0\n",
    "            info_dict = {}\n",
    "            previous_start = None\n",
    "            previous_end = None\n",
    "            while index < len(intervals):\n",
    "                start, end = intervals[index]\n",
    "    \n",
    "                if process_type == None:\n",
    "                    #Zero\n",
    "                    if new_interval_start == new_interval_end:\n",
    "                        if start < new_interval_start < end:\n",
    "                            process_type = \"Zero1\"\n",
    "                            index = 0\n",
    "                            continue\n",
    "                        if previous_start != None and previous_end != None:\n",
    "                            if new_interval_start == previous_end or new_interval_start == start:\n",
    "                                process_type = \"Zero6\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "                            if previous_end < new_interval_start < start:\n",
    "                                info_dict['mode_zero7_index'] = index\n",
    "                                process_type = \"Zero7\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "\n",
    "                        if index == 0:\n",
    "                            if new_interval_end == start:\n",
    "                                process_type = \"Zero2\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "                            if new_interval_end < start:\n",
    "                                process_type = \"Zero3\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "                        if index == len(intervals) - 1:\n",
    "                            if new_interval_start == end:\n",
    "                                process_type = \"Zero4\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "                            if end < new_interval_start:\n",
    "                                process_type = \"Zero5\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "\n",
    "\n",
    "                    #A\n",
    "                    if start < new_interval_start and new_interval_end < end:\n",
    "                        process_type = \"A\"\n",
    "                        index = 0\n",
    "                        continue\n",
    "                    \n",
    "                    #B\n",
    "                    if start <= new_interval_start <= end:\n",
    "                        info_dict['mode_b_index1'] = index\n",
    "                    if start <= new_interval_end <= end:\n",
    "                        info_dict['mode_b_index2'] = index\n",
    "                    mode_b_index1 = info_dict.get('mode_b_index1')\n",
    "                    mode_b_index2 = info_dict.get('mode_b_index2')\n",
    "                    if mode_b_index1 != None and mode_b_index2 != None:\n",
    "                        process_type = \"B\"\n",
    "                        index = 0\n",
    "                        continue\n",
    "                    \n",
    "                    #C\n",
    "                    if start <= new_interval_start <= end:\n",
    "                        info_dict['mode_c_index1'] = index\n",
    "                    if previous_end != None:\n",
    "                        if info_dict.get('mode_c_index1') != None:\n",
    "                            if previous_end < new_interval_end < start: \n",
    "                                info_dict['mode_c_index2'] = index\n",
    "                                process_type = \"C\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "                    if index == len(intervals) - 1:\n",
    "                        if info_dict.get('mode_c_index1') != None and info_dict.get('mode_c_index2') == None:\n",
    "                            if end <= new_interval_end:\n",
    "                                process_type = \"C1\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "\n",
    "                    #D\n",
    "                    if previous_end != None:\n",
    "                        if previous_end < new_interval_start < start: \n",
    "                            info_dict['mode_d_index1'] = index\n",
    "                    if index == 0:\n",
    "                        if new_interval_start < start:\n",
    "                            info_dict['mode_d1_condition_1'] = True\n",
    "                    if start <= new_interval_end <= end:\n",
    "                        info_dict['mode_d_index2'] = index\n",
    "                        if info_dict.get(\"mode_d_index1\") != None:\n",
    "                            process_type = \"D\"\n",
    "                            index = 0\n",
    "                            continue\n",
    "                        elif info_dict.get('mode_d1_condition_1') != None:\n",
    "                            process_type = \"D1\"\n",
    "                            index = 0\n",
    "                            continue\n",
    "                    if index == len(intervals) - 1:\n",
    "                        if end < new_interval_end:\n",
    "                            if info_dict.get('mode_d_index1') != None:\n",
    "                                process_type = \"D2\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "                    \n",
    "                    #E\n",
    "                    if index == 0:\n",
    "                        if new_interval_start <= start:\n",
    "                            info_dict['mode_e_condition_1'] = True\n",
    "                    if index == len(intervals) - 1:\n",
    "                        if end <= new_interval_end:\n",
    "                            if info_dict.get('mode_e_condition_1') != None:\n",
    "                                process_type = \"E\"\n",
    "                                index = 0\n",
    "                                continue\n",
    "\n",
    "                    #F\n",
    "                    if index == 0:\n",
    "                        if new_interval_end < start:\n",
    "                            info_dict['mode_f_condition_1'] = True\n",
    "                            process_type = \"F\"\n",
    "                            index = 0\n",
    "                            continue\n",
    "\n",
    "                    #G\n",
    "                    if index == len(intervals) - 1:\n",
    "                        if end < new_interval_start:\n",
    "                            info_dict['mode_g_condition_1'] = True\n",
    "                            process_type = \"G\"\n",
    "                            index = 0\n",
    "                            continue\n",
    "                    \n",
    "                    # H\n",
    "                    if previous_start != None and previous_end != None:\n",
    "                        if previous_end < new_interval_start < start:\n",
    "                            info_dict['mode_h_index1'] = index\n",
    "                        if previous_end < new_interval_end < start:\n",
    "                            info_dict['mode_h_index2'] = index\n",
    "                            process_type = \"H\"\n",
    "                            index = 0\n",
    "                            continue\n",
    "\n",
    "                else:\n",
    "                    if process_type == 'Zero1':\n",
    "                        return intervals\n",
    "                    if process_type == 'Zero2':\n",
    "                        return intervals\n",
    "                    if process_type == 'Zero3':\n",
    "                        return [[new_interval_start, new_interval_end]] + intervals\n",
    "                    if process_type == 'Zero4':\n",
    "                        return intervals\n",
    "                    if process_type == 'Zero5':\n",
    "                        return intervals + [[new_interval_start, new_interval_end]]\n",
    "                    if process_type == 'Zero6':\n",
    "                        return intervals\n",
    "                    if process_type == 'Zero7':\n",
    "                        mode_zero7_index = info_dict.get('mode_zero7_index')\n",
    "                        the_start = new_interval_start\n",
    "                        the_end = new_interval_end\n",
    "                        return intervals[:mode_zero7_index] + [[the_start, the_end]] + intervals[mode_zero7_index:]\n",
    "                    if process_type == 'A':\n",
    "                        return intervals\n",
    "                    if process_type == 'B':\n",
    "                        mode_b_index1 = info_dict.get('mode_b_index1')\n",
    "                        mode_b_index2 = info_dict.get('mode_b_index2')\n",
    "                        the_start = intervals[mode_b_index1][0]\n",
    "                        the_end = intervals[mode_b_index2][1]\n",
    "                        return intervals[:mode_b_index1] + [[the_start, the_end]] + intervals[mode_b_index2+1:]\n",
    "                    if process_type == 'C':\n",
    "                        mode_c_index1 = info_dict.get('mode_c_index1')\n",
    "                        mode_c_index2 = info_dict.get('mode_c_index2')\n",
    "                        the_start = intervals[mode_c_index1][0]\n",
    "                        the_end = new_interval_end\n",
    "                        return intervals[:mode_c_index1] + [[the_start, the_end]] + intervals[mode_c_index2:]\n",
    "                    if process_type == 'C1':\n",
    "                        mode_c_index1 = info_dict.get('mode_c_index1')\n",
    "                        the_start = intervals[mode_c_index1][0]\n",
    "                        the_end = new_interval_end\n",
    "                        return intervals[:mode_c_index1] + [[the_start, the_end]]\n",
    "                    if process_type == 'D':\n",
    "                        mode_d_index1 = info_dict.get('mode_d_index1')\n",
    "                        mode_d_index2 = info_dict.get('mode_d_index2')\n",
    "                        the_start = new_interval_start\n",
    "                        the_end = intervals[mode_d_index2][1]\n",
    "                        return intervals[:mode_d_index1] + [[the_start, the_end]] + intervals[mode_d_index2+1:]\n",
    "                    if process_type == 'D1':\n",
    "                        mode_d_index2 = info_dict.get('mode_d_index2')\n",
    "                        the_start = new_interval_start\n",
    "                        the_end = intervals[mode_d_index2][1]\n",
    "                        return [[the_start, the_end]] + intervals[mode_d_index2+1:]\n",
    "                    if process_type == 'D2':\n",
    "                        mode_d_index1 = info_dict.get('mode_d_index1')\n",
    "                        the_start = new_interval_start\n",
    "                        the_end = new_interval_end\n",
    "                        return intervals[:mode_d_index1] + [[the_start, the_end]]\n",
    "                    if process_type == 'E':\n",
    "                        mode_e_condition1 = info_dict.get('mode_e_condition1')\n",
    "                        mode_e_condition2 = info_dict.get('mode_e_condition2')\n",
    "                        the_start = new_interval_start\n",
    "                        the_end = new_interval_end\n",
    "                        return [[the_start, the_end]]\n",
    "                    if process_type == 'F':\n",
    "                        the_start = new_interval_start\n",
    "                        the_end = new_interval_end\n",
    "                        return [[the_start, the_end]] + intervals[:]\n",
    "                    if process_type == 'G':\n",
    "                        the_start = new_interval_start\n",
    "                        the_end = new_interval_end\n",
    "                        return intervals[:] + [[the_start, the_end]] \n",
    "                    if process_type == 'H':\n",
    "                        mode_h_index1 = info_dict.get('mode_h_index1')\n",
    "                        mode_h_index2 = info_dict.get('mode_h_index2')\n",
    "                        the_start = new_interval_start\n",
    "                        the_end = new_interval_end\n",
    "                        return intervals[:mode_h_index1] + [[the_start, the_end]] + intervals[mode_h_index2:]\n",
    "    \n",
    "                previous_start = start\n",
    "                previous_end = end\n",
    "                index += 1\n",
    "        \n",
    "        return get_final_intervals()\n",
    "        #2022.12.4 17:18\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "889a5204-112b-4140-b389-b9b450af0d13",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
